package com.banca2.bracketplant.widget;

import android.content.Context;
import android.graphics.Bitmap;
import android.util.Log;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;

import com.banca2.bracketplant.utils.LogUtil;

/*********************************************************************<br>
 * ViewHolder.java													 *<br>
 * 功 能：	通用ViewHolder封装，以简化Adaptor开发							 *<br>
 * 																	 *<br>
 *  Ver   变更日期        负责人  					变更内容                        			 *<br>
 * ───────────────────────────────────────────────────────────────── *<br>
 * V0.01 2015-6-7	ZQ      				    创建					 *<br>
 * 																	 *<br>
 * Copyright (c) 2015 StarFollower Corporation. All rights reserved. *<br>
 *┌─────────────────────────────────────────────────────────────────┐*<br>
 *│　此技术信息为本团队机密信息，未经本团队书面同意禁止向第三方披露．　				│*<br>
 *│　版权所有：StarFollower　　　　　　　　　　                     　					│*<br>
 *└─────────────────────────────────────────────────────────────────┘*<br>
 *********************************************************************/
public class ViewHolder {
	
	// 列表中的项视图
	private View mConvertView;
	
	// 存储项视图的子视图，键位视图ID
	private final SparseArray<View> mViews;
	
	// 项视图坐标
	private final int mPosition;

	/**
	 * 创建或者取出一个ViewHolder对象
	 * 
	 * @param context 上下文环境
	 * @param convertView 当前需要改变的视图
	 * @param parent 当前需要改变的视图的父视图
	 * @param layoutId 当前需要改变的视图所使用的布局ID
	 * @param position 当前需要改变的视图的位置索引
	 * @return
	 *
	 * @author ZQ
	 */
	public static ViewHolder get(Context context, View convertView,
			ViewGroup parent, int layoutId, int position) {

		if (convertView == null) {
			Log.v("ViewHolder", "为首次出现的项视图创建ViewHolder - position=" + position);
			return new ViewHolder(context, parent, layoutId, position);
		} else {
			Log.v("ViewHolder", "取得非首次出现的项视图的ViewHolder - position=" + position);
			return (ViewHolder) convertView.getTag();
		}
	}//get

	/**
	 * 私有构造函数
	 * 
	 * @param context 上下文环境
	 * @param parent 当前需要改变的视图的父视图
	 * @param layoutId 当前需要改变的视图所使用的布局ID
	 * @param position 当前需要改变的视图的位置索引
	 *
	 * @author ZQ
	 */
	private ViewHolder(Context context, ViewGroup parent, int layoutId,
			int position) {
		LogUtil.v(this, "ViewHolder(Context, ViewGroup, int, int) - position=" + position);
		this.mViews = new SparseArray<View>();
		this.mPosition = position;
		mConvertView = LayoutInflater.from(context).inflate(layoutId, parent, false);
		mConvertView.setTag(this);
	}//ViewHolder

	/**
	 * 通过视图Id获取项视图的子视图
	 * 
	 * @param viewId 项视图的子视图ID
	 * @return 项视图的子视图
	 *
	 * @author ZQ
	 */
	@SuppressWarnings("unchecked")
	public <T extends View> T getView(int viewId) {
		View view = mViews.get(viewId);
		if (null == view) {
			LogUtil.v(this, "getView(int) - 首次获取该子控件 - viewId=" + viewId);
			view = mConvertView.findViewById(viewId);
			mViews.put(viewId, view);
		} else {
			LogUtil.v(this, "getView(int) - 再次获取该子控件 - viewId=" + viewId);
		}
		return (T) view;
	}//getView

	public View getConvertView() {
		return mConvertView;
	}
	
	public int getPosition() {
		return mPosition;
	}
	
	// 用法示例
//	@Override
//	public View getView(int position, View convertView, ViewGroup parent) {
//		// 实例化一个viewHolder
//		ViewHolder viewHolder = ViewHolder.get(mContext, convertView, parent,
//				R.layout.item_single_str, position);
//		// 通过getView获取控件
//		TextView tv = viewHolder.getView(R.id.id_tv_title);
//		// 使用
//		tv.setText(mDatas.get(position));
//		return viewHolder.getConvertView();
//	}

	/**
	 * 为TextView设置字符串
	 * 
	 * @param viewId
	 * @param textId
	 * @return
	 */
	public ViewHolder setText(int viewId, int textId) {
		TextView view = getView(viewId);
		view.setText(textId);
		return this;
	}

	/**
	 * 为TextView设置字符串
	 * 
	 * @param viewId
	 * @param text
	 * @return
	 */
	public ViewHolder setText(int viewId, String text) {
		TextView view = getView(viewId);
		view.setText(text);
		return this;
	}

	/**
	 * 为ImageView设置图片
	 * 
	 * @param viewId
	 * @param drawableId
	 * @return
	 */
	public ViewHolder setImageResource(int viewId, int drawableId) {
		ImageView view = getView(viewId);
		view.setImageResource(drawableId);
		return this;
	}

	/**
	 * 为ImageView设置图片
	 * 
	 * @param viewId
	 * @param drawableId
	 * @return
	 */
	public ViewHolder setImageBitmap(int viewId, Bitmap bm) {
		ImageView view = getView(viewId);
		view.setImageBitmap(bm);
		return this;
	}

}
